// 封装 接口 请求
// 引入 接口 请求 前缀
import $C from '@/common/conflig.js'
// 引入 vuex 。获取 token
import $store from '@/store/index.js'
export default {
	// 将请求头，请求方式，数据发送到后端的data，单拎出来
	common: {
		method: 'GET',
		header: {
			'content-type': 'application/json'
		},
		data: {}
	},
	// Promise 
	// (接收一个 options参数=对象，options对象就包含了common里面的所有东西)
	request(options = {}) {
		/* 接口前缀 拼接 + '调用get或post传入的 尾缀请求地址'
		   https://ceshi2.dishait.cn/api/v1/postclass
		   options.url = $C.webUrl + '/postclass' */
		options.url = $C.webUrl + options.url
		// 请求方法 (如果options.method有值，例如post就不走后面的 this.common.method了)
		// 如果没有，走this.common.method默认的 GET 方法
		options.method = options.method || this.common.method
		// 请求头
		options.header = options.header || this.common.header
		// 将以上 赋值的options各项内容，传入 Pomise化API中

		/* 验证权限 token*/
		if (options.token) { // 如果options中包含token,或者设置为true了 
			// 将vuex中读取到的token，赋值给 header头
			options.header.token = $store.state.token
			/* !options.noCheck 不存在，要验证，首页index需要这个参数
			 !options.notoast 不存在，要验证，个人页面mine组件需要这个参数*/
			if (!options.noCheck&&!options.header.token&&!options.notoast) {
				return uni.showToast({
					title: '非法token，请重新登录！',
					icon: 'none'
				})
			}
		}
		/* 返回，调用 上面request方法，将赋值options传过去
	       return uni.request(options); */

		// 使用Promise 返回成功 或失败 
		return new Promise((res, rej) => {
			uni.request({
				...options,
				success: (result) => {
					// 返回原始数据
					if (options.native) {
						return res(result)
					}
					// 请求服务器失败
					if (result.statusCode !== 200) {
						uni.showToast({
							title: result.data.msg || '请求失败',
							icon: 'none'
						})
						// 将请求失败的参数，返回给 Promise上，自定义失败参数rej
						return rej(result.data);
					}
					// 请求服务器 成功
					res(result.data.data)
				},
				// 请求失败，断网情况下 会触发
				fail: (error) => {
					uni.showToast({
						title: error.errMsg || '请求失败',
						icon: 'none'
					})
					return rej()
				}
			})
		})
	},
	/**
	 * （接口调用 先走这里，在走上面的 request方法）
	 * 封装 get请求 
	 * 接收(请求地址，需要往后台传入的参数，封装好的options)
	 */
	get(url, data = {}, options = {}) {
		options.url = url
		options.data = data
		options.method = 'GET'
		// 返回，调用 上面request方法，将赋值options传过去
		return this.request(options)
	},
	post(url, data = {}, options = {}) {
		options.url = url
		options.data = data
		options.method = 'POST'
		// 返回，调用 上面request方法，将赋值options传过去
		return this.request(options)
	},
	// 修改 头像 图片
	// (请求地址，options ={options.url,options.header包含这些})
	upload(url, options = {}) {
		options.url = $C.webUrl + url // 请求 路径
		options.header = options.header || {} // 请求 头
		// 验证权限token
		if (options.token) {
			// 将vuex中读取到的token，赋值给 header头
			options.header.token = $store.state.token 
			if (!options.header.token) {
				return uni.showToast({
					title: '非法token,请重新登录',
					icon: 'none'
				});
			}
		}

		return new Promise((res, rej) => {
			// uni 官方 上传文件
			uni.uploadFile({
				...options,
				success: (uploadFileRes) => {
					// console.log('上传的文件',uploadFileRes);
					if (uploadFileRes.statusCode !== 200) {
						return uni.showToast({
							title: '上传图片失败',
							icon: 'none'
						});
					}
					// 转化 文件 路径地址
					let data = JSON.parse(uploadFileRes.data)
					// 成功的话，返回序列化的 地址
					res(data)
				},
				fail: (err) => {
					rej(err)
				}
			});
		})

	},
    // 错误处理
	errorCheck(err,res,errfun = false,resfun = false){
		if (err) {
			typeof errfun === 'function' && errfun();
			uni.showToast({ title: '加载失败',icon:"none" });
			return false;
		}
		if (res.data.errorCode) {
			typeof errfun === 'function' && resfun();
			uni.showToast({ title: res.data.msg,icon:"none" });
			return false;
		}
		return true;
	},
}